package com.witmore.skyline.web.service.third.aliyun;


import com.witmore.skyline.web.service.third.aliyun.dto.PedestrianDetectionResult;
import jakarta.annotation.PostConstruct;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

/**
 * 带QPS限制的阿里云人体检测服务
 * 使用令牌桶算法确保QPS限制，支持简单监控
 * @author 豆子高
 * @date 2025-08-25
 */
@Slf4j
@Service
public class QpsLimitedPedestrianDetectionService {

    @Autowired
    private AliyunPedestrianDetectionService aliyunPedestrianDetectionService;

    /**
     * QPS限制，默认5
     */
    @Getter
    @Value("${aliyun.viapi.pedestrian.qps:5}")
    private int qpsLimit;

    /**
     * QPS限流器
     */
    private SimpleRateLimiter rateLimiter;

    @PostConstruct
    public void init() {
        // 初始化QPS限制器，每秒最多qpsLimit个请求
        this.rateLimiter = new SimpleRateLimiter(qpsLimit);

        log.info("QPS限制人体检测服务初始化完成 - QPS: {} req/s", qpsLimit);
    }

    /**
     * 同步人体检测（会阻塞等待，确保按顺序处理）
     * @param imageUrl 图片URL
     * @return 检测结果
     */
    public PedestrianDetectionResult detectPedestrian(String imageUrl) {
        boolean tokenAcquired = false;
        try {
            // 获取QPS令牌（10秒超时，确保每秒最多qpsLimit个请求）
            log.debug("正在等待QPS令牌，图片URL：{}", imageUrl);
            tokenAcquired = rateLimiter.acquire(1, 10, TimeUnit.SECONDS);

            if (!tokenAcquired) {
                log.warn("获取QPS令牌超时，图片URL：{}，当前QPS：{}，建议检查系统负载", imageUrl, qpsLimit);
                return createTimeoutResult();
            }

            // 直接调用原始检测服务
            log.debug("已获得QPS令牌，开始人体检测，图片URL：{}", imageUrl);
            PedestrianDetectionResult result = aliyunPedestrianDetectionService.detectPedestrian(imageUrl);
            log.info("人体检测完成，图片URL：{}，检测到人体：{}", imageUrl, result.isHasHuman());

            return result;
        } catch (Exception e) {
            log.error("人体检测失败，图片URL：{}，错误：{}", imageUrl, e.getMessage());
            return createErrorResult();
        } finally {
            // QPS限制器基于时间自动恢复，无需手动释放令牌
            if (tokenAcquired) {
                log.debug("QPS令牌使用完成，当前可用令牌：{}", rateLimiter.getAvailableTokens());
            }
        }
    }



    /**
     * 创建错误结果
     */
    private PedestrianDetectionResult createErrorResult() {
        PedestrianDetectionResult result = new PedestrianDetectionResult();
        result.setHasHuman(false);
        result.setHumanCount(0);
        return result;
    }

    /**
     * 创建超时结果
     */
    private PedestrianDetectionResult createTimeoutResult() {
        PedestrianDetectionResult result = new PedestrianDetectionResult();
        result.setHasHuman(false);
        result.setHumanCount(0);
        return result;
    }


    /**
     * 获取当前QPS状态（简单监控）
     */
    public String getQpsStatus() {
        if (rateLimiter != null) {
            return rateLimiter.getStatsInfo();
        }
        return "QPS限制器未初始化";
    }


}
